/*************************************************************************************
 *
 *	模块名称 : 词典模块
 *	文件名称 : FrameBuffer.h
 *	版   本 : V1.0
 *	说   明 : 根据显示的需求将图形打印到屏幕上。
 *	修改记录 :
 *		     版本号       日期         作者        说明
 *	         V1.0     2023-04-10      rush_long		发布
 *
 *	
 *
 *************************************************************************************/

#ifndef __FRAMEBUFF_H__
#define __FRAMEBUFF_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/fb.h>

/* 测试FrameBuff设备是否为RGB565标准 */
#define IS_RGB565_FORMAT(bits)				(((bits) / 8 == 2) ? 1 : 0)
/* 测试FrameBuff设备是否为RGB888标准 */
#define IS_RGB888_FORMAT(bits)				(((bits) / 8 == 4) ? 1 : 0)

/* 填充RGB888颜色 */
#define FILL_RGB888_COL(col, r, g, b)		do { \
	(col)->R = r; \
	(col)->G = g; \
	(col)->B = b; \
} while (0)

/* 填充RGB565颜色 */
#define FILL_RGB565_COL(col, r, g, b)		do { \
	(*(short *)col) = ((((r >> 3) << 11) & 0xF800) | (((g >> 2) << 5) & 0x07E0) | ((b >> 3) & 0x001F)); \
} while (0)

/* RGB888 像素点结构类型 */
typedef struct rgb888 
{
	unsigned char B;						//红
	unsigned char G;						//绿
	unsigned char R;						//蓝
	unsigned char Reserved;					//保留(内存对齐)
}RGB888_T;

/* RGB565 像素点结构类型 */
typedef struct rgb565
{
	unsigned short R:5;						//红
	unsigned short G:6;						//绿
	unsigned short B:5;						//蓝
}RGB565_T;

/* FrameBuff结构信息类型 */
typedef struct framebuff_dev
{
	RGB888_T *pRGB888Addr;					//RGB888显存首地址
	RGB565_T *pRGB565Addr;					//RGB565显存首地址
	struct fb_var_screeninfo ScreenInfo;	//Framebuff设备信息
}FB_T;

/***************************************************************
 *函数名: FrameBuffInit
 *功  能: FrameBuff初始化,创建显存空间
 *参  数: 
 * 		pDevName:FrameBuff设备文件路径
 *返回值: 
 * 		成功返回Framebuff结构信息首地址
 * 		失败返回NULL
 *注意事项:
 *		1.申请的显存空间在gRgbAddrInfo结构体中
 *		2.如果设备为RGB565标准则显存地址位于结构体pRGB565Addr成员中
 *      3.如果设备为RGB888标准则显存地址位于结构体pRGB888Addr成员中
 **************************************************************/
extern FB_T *FrameBuffInit(const char *pDevName);

/***************************************************************
 *函数名: FrameBuffDeInit
 *功  能: FrameBuff销毁,销毁显存空间
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 ***************************************************************/
extern int FrameBuffDeInit(FB_T *pFb);

/***************************************************************
 *函数名: DrawOnePixel
 *功  能: 绘制一个像素点
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		x:点的横坐标
 * 		y:点的纵坐标
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawOnePixel(FB_T *pFb, int x, int y, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawHorLine
 *功  能: 绘制一条横线
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		x:横线起始位置横坐标
 * 		y:横线起始位置纵坐标
 * 		width:横线的长度
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawHorLine(FB_T *pFb, int x, int y, int width, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawVerLine
 *功  能: 绘制一条纵线
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		x:横线起始位置横坐标
 * 		y:横线起始位置纵坐标
 * 		width:横线的长度
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawVerLine(FB_T *pFb, int x, int y, int height, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawSolidRect
 *功  能: 绘制实心矩形
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		x:矩形左上角位置横坐标
 * 		y:横线左上角位置纵坐标
 * 		width:矩形长
 * 		height:矩形宽
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawSolidRect(FB_T *pFb, int x, int y, int width, int height, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawHollowRect
 *功  能: 绘制空心矩形
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		x:矩形左上角位置横坐标
 * 		y:横线左上角位置纵坐标
 * 		width:矩形长
 * 		height:矩形宽
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawHollowRect(FB_T *pFb, int x, int y, int width, int height, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: ClearScreen
 *功  能: 清屏
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int ClearScreen(FB_T *pFb);

/***************************************************************
 *函数名: DrawOneAscii
 *功  能: 显示一个ASCII码
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		  x:显示字符位置的横坐标
 * 		  y:显示字符位置的纵坐标
 * 		ascii:显示字符的ASCII码值
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawOneAscii(FB_T *pFb, int x, int y, unsigned char ascii, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawString
 *功  能: 显示ASCII码字符串
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		  x:显示起始字符位置的横坐标
 * 		  y:显示起始字符位置的纵坐标
 * 		pstr:显示字符串空间首地址
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawString(FB_T *pFb, int x, int y, const char *pstr, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawOneHanZi
 *功  能: 显示一个汉字
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		  x:显示字符位置的横坐标
 * 		  y:显示字符位置的纵坐标
 * 		pstr:汉字字符串
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawOneHanZi(FB_T *pFb, int x, int y,  const char *pstr, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawHanZiStr
 *功  能: 显示汉字字符串
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		  x:显示字符位置的横坐标
 * 		  y:显示字符位置的纵坐标
 * 		pstr:汉字字符串
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawHanZiStr(FB_T *pFb, int x, int y,  const char *pstr, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawLine
 *功  能: 绘制折线
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		  x0:点1横坐标
 * 		  y0:点1纵坐标
 * 		  x1:点2横坐标
 * 		  y1:点2纵坐标
 * 		TmpR:红
 * 		TmpG:绿
 * 		TmpB:蓝
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 ***************************************************************/
extern int DrawLine(FB_T *pFb, int x0, int y0, int x1, int y1, unsigned char TmpR, unsigned char TmpG, unsigned char TmpB);

/***************************************************************
 *函数名: DrawBmp
 *功  能: 绘制图片
 *参  数: 
 * 		pFb:FrameBuff设备信息结构体地址
 * 		  x:起始点坐标
 * 		  y:起始点坐标
 * 		width:宽
 * 		height:高
 * 		pBmpName:图片路径
 *返回值: 
 * 		成功返回0
 * 		失败返回-1
 *注意事项:
 *		1.绘制不要越界(2440屏幕大小:240 * 320、4412屏幕大小:800 * 480或1024 * 600)
 *      2.图片格式为 24位 BMP图片
 ***************************************************************/
extern int DrawBmp(FB_T *pFb, int x, int y, int width, int height, const char *pBmpName);

/********************************************
 *函数名:SaveMouseInfo
 *功  能:保存鼠标后面像素点内容
 *参  数:
 *     pTmpRgbInfo:存放显存空间地址结构体指针
 *     x:横坐标
 *     y:纵坐标
 *     pBmpName:bmp图片文件名
 *     Width:鼠标图片宽度
 *     Height:鼠标图片高度
 *     pTmpBuff:存放像素点空间首地址
 *     Len:最大存放行数
 *返回值:
 *     成功返回   0
 *     失败返回   -1
 *注意事项:
 *     鼠标图片大小横向像素点不能超过256
 *     鼠标图片大小纵向像素点不能超过800
 *******************************************/
extern int SaveMouseInfo(FB_T *pTmpRgbInfo, int x, int y, int Width, int Height, unsigned char (*pTmpBuff)[1024], int Len);

/********************************************
 *函数名:ReloadMouseInfo
 *功  能:加载鼠标后面原像素点内容
 *参  数:
 *     pTmpRgbInfo:存放显存空间地址结构体指针
 *     x:横坐标
 *     y:纵坐标
 *     Width:鼠标图片宽度
 *     Height:鼠标图片高度
 *     pTmpBuff:存放像素点空间首地址
 *     Len:最大存放行数
 *返回值:
 *     成功返回   0
 *     失败返回   -1
 *注意事项:
 *******************************************/
extern int ReloadMouseInfo(FB_T *pTmpRgbInfo, int x, int y, int Width, int Height, unsigned char (*pTmpBuff)[1024], int Len);

/********************************************
 *函数名:BmpInit
 *功  能:图片资源初始化
 *参  数:
 *     pBmpName:bmp图片文件名
 *     Width:图片宽度
 *     Height:图片高度
 *返回值:
 *     成功返回   图片资源空间首地址
 *     失败返回   NULL
 *注意事项:
 *     使用完毕后需要释放图片资源
 *******************************************/
extern unsigned char *BmpInit(FB_T *pTmpRgbInfo, char *pBmpName, int Width, int Height);

/********************************************
 *函数名:DrawBmpBuff
 *功  能:通过bmp缓存绘制图片
 *参  数:
 *     pBmpName:bmp图片文件名
 *     Width:图片宽度
 *     Height:图片高度
 *返回值:
 *     成功返回   图片资源空间首地址
 *     失败返回   NULL
 *注意事项:
 *     使用完毕后需要释放图片资源
 *******************************************/
extern int DrawBmpBuff(FB_T *pFb, unsigned char *pBmpBuff, int width, int height);

/********************************************
 *函数名:BmpDeInit
 *功  能:图片资源释放
 *参  数:
 *     pBmpName:bmp图片文件名
 *返回值:
 *     成功返回   0
 *     失败返回   -1
 *注意事项:
 *     使用完毕后需要释放图片资源
 *******************************************/
extern int BmpDeInit(unsigned char *pBmpBuff);

#endif
